import JEditableTable from '@/components/jeecg/JEditableTable'
import { VALIDATE_NO_PASSED, getRefPromise, validateFormAndTables } from '@/utils/JEditableTableUtil'
import { httpAction, getAction } from '@/api/manage'

export const JEditableTableMixin = {
    components: {
        JEditableTable
    },
    data () {
        return {
            title: '操作',
            visible: false,
            form: this.$form.createForm(this),
            confirmLoading: false,
            model: {},
            labelCol: {
                xs: { span: 24 },
                sm: { span: 6 }
            },
            wrapperCol: {
                xs: { span: 24 },
                sm: { span: 18 }
            }
        }
    },
    methods: {

        /** 获取所有的editableTable实例 */
        getAllTable () {
            if (!(this.refKeys instanceof Array)) {
                throw this.throwNotArray('refKeys')
            }
            let values = this.refKeys.map(key => getRefPromise(this, key))
            return Promise.all(values)
        },

        /** 遍历所有的JEditableTable实例 */
        eachAllTable (callback) {
            // 开始遍历
            this.getAllTable().then(tables => {
                tables.forEach((item, index) => {
                    if (typeof callback === 'function') {
                        callback(item, index)
                    }
                })
            })
        },

        /** 当点击新增按钮时调用此方法 */
        add () {
            if (typeof this.addBefore === 'function') this.addBefore()
            // 默认新增空数据
            let rowNum = this.addDefaultRowNum
            if (typeof rowNum !== 'number') {
                rowNum = 1
                console.warn('由于你没有在 data 中定义 addDefaultRowNum 或 addDefaultRowNum 不是数字，所以默认添加一条空数据，如果不想默认添加空数据，请将定义 addDefaultRowNum 为 0')
            }
            this.eachAllTable((item) => {
                item.add(rowNum)
            })
            if (typeof this.addAfter === 'function') this.addAfter(this.model)
            this.edit({})
        },
        /** 当点击了编辑（修改）按钮时调用此方法 */
        edit (record) {
            if (typeof this.editBefore === 'function') this.editBefore(record)
            this.visible = true
            this.activeKey = this.refKeys[0]
            this.form.resetFields()
            this.model = Object.assign({}, record)
            if (typeof this.editAfter === 'function') this.editAfter(this.model)
        },
        /** 关闭弹窗，并将所有JEditableTable实例回归到初始状态 */
        close () {
            this.visible = false
            this.eachAllTable((item) => {
                item.initialize()
            })
            this.$emit('close')
        },

        /** 查询某个tab的数据 */
        requestSubTableData (url, params, tab, success) {
            tab.loading = true
            getAction(url, params).then(res => {
                if (res && res.code === 200) {
                    tab.dataSource = res.data.rows
                    // eslint-disable-next-line no-unused-expressions
                    typeof success === 'function' ? success(res) : ''
                }
            }).finally(() => {
                tab.loading = false
            })
        },
        /** 发起请求，自动判断是执行新增还是修改操作 */
        request (formData) {
            let url = this.url.add; let method = 'post'
            if (this.model.id) {
                url = this.url.edit
                method = 'put'
            }
            this.confirmLoading = true
            httpAction(url, formData, method).then((res) => {
                if (res.code === 200) {
                    this.$emit('ok')
                    this.confirmLoading = false
                    this.close()
                    if (formData.orderType === 'CGDD') {
                        this.$router.push({
                            path: '/bill/purchase_order'
                        })
                    }
                } else {
                    this.$message.warning(res.data.message)
                    this.confirmLoading = false
                }
            }).finally(() => {
            })
        },

        /* --- handle 事件 --- */

        /** ATab 选项卡切换事件 */
        handleChangeTabs (key) {
            // 自动重置scrollTop状态，防止出现白屏
            getRefPromise(this, key).then(editableTable => {
                editableTable.resetScrollTop()
            })
        },
        /** 关闭按钮点击事件 */
        handleCancel () {
            this.close()
        },
        /** 确定按钮点击事件 */
        handleOk () {
            const that = this

            /** 触发表单验证 */
            this.getAllTable().then(tables => {
                /** 一次性验证主表和所有的次表 */
                return validateFormAndTables(this.form, tables)
            }).then(allValues => {
                if (typeof this.classifyIntoFormData !== 'function') {
                    throw this.throwNotFunction('classifyIntoFormData')
                }
                let formData = this.classifyIntoFormData(allValues)
                return this.request(formData)
                // const info = JSON.parse(formData.info)
                // const rows = JSON.parse(formData.rows)
                // if (info.subType === '销售订单' && rows.length && !this.model.id) {
                //     const item = rows[0]
                //     console.log('')
                //     const params = {
                //         search: { 'categoryId': '', 'materialParam': item.barCode || '', 'materialOther': '', 'remark': '' },
                //         column: 'createTime',
                //         currentPage: 1,
                //         pageSize: 100
                //     }
                //     getAction('/material/list', params).then((res) => {
                //         if (res.code === 200 && res.data.rows.length) {
                //             const dataSource = res.data.rows[0]
                //             // 库存没有时直接转化为采购订单
                //             const stock = Number(dataSource.stock)
                //             if (!stock) {
                //                 that.$confirm({
                //                     title: '确认操作',
                //                     content: '商品库存量为0，是否转换成采购订单（注意：转换之后请修改【供应商】）?',
                //                     onOk: function () {
                //                         info.defaultNumber = `CGDD${info.defaultNumber.slice(4)}`
                //                         info.number = `CGDD${info.number.slice(4)}`
                //                         info.subType = '采购订单'
                //                         info.organId = null // 暂时置空
                //                         info.accountId = null // 暂时置空
                //                         const reqParams = { info: JSON.stringify(info), rows: formData.rows, orderType: 'CGDD' }
                //                         // 发起请求
                //                         return that.request(reqParams)
                //                     }
                //                 })
                //             } else {
                //                 return that.request(formData)
                //             }
                //         }
                //     })
                // } else {
                //     // 发起请求
                //     return this.request(formData)
                // }
            }).catch(e => {
                if (e.error === VALIDATE_NO_PASSED) {
                    // 如果有未通过表单验证的子表，就自动跳转到它所在的tab
                    this.activeKey = e.index == null ? this.activeKey : this.refKeys[e.index]
                } else {
                    console.error(e)
                }
            })
        },
        /* --- throw --- */

        /** not a function */
        throwNotFunction (name) {
            return `${name} 未定义或不是一个函数`
        },

        /** not a array */
        throwNotArray (name) {
            return `${name} 未定义或不是一个数组`
        }

    }
}
